﻿#define _CRT_SECURE_NO_WARNINGS//禁用安全函数警告
#pragma warning(disable:6031)//禁用 6031 的安全警告

#include<stdio.h>

//1.变量的作用域与生命周期，变量的使用
//int main()
//{
//	{
//		int a = 100;//a是局部变量，出作用域自动销毁
//
//	}
//	printf("%d\n", a);//错误
//	return 0;
//}

//变量一定要先声明后使用，或者直接将变量定义在最前面 
//int year = 2022;
//
//void test()
//{
//	printf("year:%d\n", year);
//}
//
//int main()
//{
//	printf("%d\n", year);
//	test();//调用函数
//}

//反例
//int year;//声明
//
//void test()
//{
//	printf("year:%d\n", year);
//}
//
//int year = 2022;//上面函数调用了这里的全局变量，但是全局变量置于其后，编译器不知道已经定义，需要在函数前面加声明
//
//int main()
//{
//	printf("%d\n", year);
//	test();//调用函数
//}

////全局变量的作用域是整个工程
//extern int a;//声明外部变量
//int main()
//{
//	printf("%d", a);
//}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//2.常量-值不能改变
// 
//字面常量
//const修饰的常变量
//define定义的标识符常量
//枚举常量

//字面常量：
//int main()
//{
//	3;
//	100;
//	3.14;
//	'a';//字符字面常量
//	"abcdef";//字符串字面常量
//	return 0;
//
//}

//const修饰的常变量：作用是使变量不可被修改
//int main()
//{
//	const int num = 100;//const修饰，限制了num不能被修改，使其具有了常量属性，但本质上还是一个变量
//	//num = 200;//此时num不能被修改,说明具有了常量属性
//	printf("%d\n", num);
//
//	//int arr[10] = {};错误写法
//
//	int arr[10] = {0};
//	//int arr[num] = { 0 };//此时报错，表达式必须含有常量值，说明const修饰的num本质上还是一个变量，所以叫常变量
//
//}

//#define 定义的标识符常量
//#define M 100
//
//int main()
//{
//	int arr[M] = {0};//M是一个常量
//	//M = 200;//define定义的标识符常量不可修改
//	printf("%d\n", M);
//	return 0;
//}

//枚举常量
//枚举--一一列举,如三原色

//enum Color
//{
//	//RED,GREE,BLUE是枚举类型Color的可能取值，同时也是常量，所以叫枚举常量
//	RED,  //0
//	GREE, //1
//	BLUE  //2
//};
//int main()
//{
//	enum Color c = BLUE;
//
//	printf("%d\n", RED);
//	printf("%d\n", GREE);
//	printf("%d\n", BLUE);
//
//	//RED = 100;//err,常量不能赋值
//
//	return 0;
//}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////字符串
////%s 打印字符串，遇到\0才停止打印
//#include<string.h>//使用strlen库函数需要包含的头文件
//int main()
//{
//	char ch = 'w';
//
//	//字符串的存储要借助数组
//	char ch1[] = { 'a','b','c' };//当打印这些字符时，后面会出现乱码，因为没有\0，在内存中也不知道\0什么时候出现
//	char ch2[] = { 'a','b','c' ,'\0'};
//	char ch3[] = "abc";//\0是字符串打印的标志, ""中存在一个隐藏的\0
//
//	printf("%s\n", ch1);//abc烫烫烫
//	printf("%s\n", ch2);//abc
//	printf("%s\n", ch3);//abc
//
//	printf("\n");
//
//	printf("%d\n", strlen(ch1));//35 随机数
//	printf("%d\n", strlen(ch2));//3,'\0'不计入字符串长度
//	printf("%d\n", strlen(ch3));//3
//
//
//
//	return 0;
//}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//转义字符

//三字母词
//? ? )     转义之后即为→   ]
//
//? ? (     转义之后即为→   [

//int main()
//{
//	
//	//printf("(are you ok??)");三字母词，现在的编译器多不支持
//	//printf("%c\n",''');//err  想要以字符形式打印单引号'
//	printf("%c\n",'\'');//right
//
//	printf("c:\test\test.c\n");//这里我们想要打印路径，\t被编译器误认为是水平制表符
//	printf("c:\\test\\test.c\n");
//
//	return 0;
//}

//  \0ddd    \xdd
// 
// 
// 参照ASCLL表，但是所给的值不能太大如\0777
//int main()
//{
//	printf("\073\n");//;
//	printf("\x34");//4
//	return 0;
//}


